// 题目要求：
// 给定一个长度为 n 的数组，给定一个整数 k，表示可以进行操作的次数
// 每次操作可以给数组中的某个数字加 1 或者 减 1
// 问经过最多 k 次操作，最多可以有几个相同的数字

// 解题思路：
// 贪心的思路：要最少的操作次数，就需要往中间的数字靠拢
// 比如 {1，3，6，8，20} 就需要往 6 靠拢，才能最小的操作次数，可以通过反证法证明
// 第一步：将数组排序，方便找到中间的数字
// 第二步：算最小的操作次数：
// 假设以 [left, right] 区间为例，最小的操作次数为：
// cost = (mid - left) * a[mid] - (sumMid - sumLeft) + (sum[right] - sum[mid]) - (right - mid) * a[mid];
// 为了优化求 cost 的效率，就需要引入一个前缀和数组 sum ，这样可以以 O(1) 的时间复杂度求出 cost
// 第三步：知道了怎么最小操作次数，用滑动窗口优化暴力枚举：
// 求每个区间里的最小操作次数，是具备单调性的：窗口越大，操作次数越多，窗口越小，操作次数越少

import java.util.*;

public class AddAndSub {
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        long k = in.nextLong();
        int[] a = new int[n + 1];
        // 定义前缀和数组
        long[] sum = new long[n + 1];
        // 读入数据
        for(int i = 1; i <= n; i++){
            a[i] = in.nextInt();
        }
        // 排序，方便确定变成哪个数花费最小
        Arrays.sort(a);
        // 求前缀和
        for(int i = 1; i <= n; i++){
            sum[i] = sum[i - 1] + a[i];
        }
        // 滑动窗口逻辑，找最大的符合要求的区间（花费小于等于 k）
        int left = 1; int right = 1;
        int ret = 1;
        int mid = 0;
        long cost = 0;
        while(right <= n){
            // 计算花费
            mid = (right - left) / 2 + left;
            cost = (mid - left) * a[mid] - (sum[mid - 1] - sum[left - 1]) +
                    (sum[right] - sum[mid]) - (right - mid) * a[mid];
            while(cost > k){
                // 出窗口
                left++;
                mid = (right - left) / 2 + left;
                cost = (mid - left) * a[mid] - (sum[mid - 1] - sum[left - 1]) +
                        (sum[right] - sum[mid]) - (right - mid) * a[mid];
            }
            // 收集结果
            //System.out.println("right = " + right + ", left = " + left);
            ret = Math.max(ret, right - left + 1);
            // 进窗口
            right++;
        }

        System.out.println(ret);
    }
}
